package com.foo.common.base.service;

import java.io.Serializable;

import org.hibernate.SessionFactory;

public interface FooGenericService {

    public SessionFactory getSessionFactory();

    /**
     * Remove a persistent instance from the datastore. The argument may be an
     * instance associated with the receiving <tt>Session</tt> or a transient
     * instance with an identifier associated with existing persistent state.
     * This operation cascades to associated instances if the association is
     * mapped with {@code cascade="delete"}
     *
     * @param object the instance to be removed
     */
    public void delete(Object object);

    public void saveOrUpdate(Object object);

    /**
     * <p>
     * If the id of the entity is null or zero, add it to the datastore and
     * assign it an id; otherwise, update the corresponding entity in the
     * datastore with the properties of this entity. In either case the entity
     * passed to this method will be attached to the session.
     * <p>
     * <p>
     * If an entity to update is already attached to the session, this method
     * will have no effect. If an entity to update has the same id as another
     * instance already attached to the session, an error will be thrown.
     *
     * @return <code>true</code> if create; <code>false</code> if update.
     */
    public Serializable save(Object object);

    /**
     * For primary id reading and loading only
     *
     * @param clazz
     * @param id
     * @return
     */
    public <T> T get(Class<T> clazz, Serializable id);

    public void update(Object entity);

    public void runInTransaction(CommonTransaction commonTransaction);

}
